9584
18732
Tähän kysymykseen on jo annettu vastauksia täällä:
Ei implisiittistä muunnosta ylikuormitetussa operaattorissa
(2 vastausta)
Suljettu 7 vuotta sitten.
Kirjoitan yksinkertaisen kääreen alkeistyypille ja yritän välttää kirjoittamasta liikaa makuja tavallisille operaattoreille. Toivoin implisiittisen tyypin muuntamisen auttavan, mutta se ei auta. Tässä on riisuttu esimerkki:
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
Int-operaattori + (const Int & rhs) {return _i + rhs._i;}
};
int main (int argc, char * argv [])
{
(mitätön) (Int (1) + 2); // Hieno
(mitätön) (2 + Int (1)); // virhe: virheelliset operandit binaarilausekkeeseen ('int' ja 'Int')
}
Käytän llvm-tiedostoa. Päärivin ensimmäinen rivi on hieno. Toinen aiheuttaa virheen. Toivoin, että toisella rivillä tapahtuisi, että 2 muunnetaan implisiittisesti Int: ksi (2), minkä jälkeen soitetaan operaattorille +. Miksi sitä ei tapahdu? Miksi implisiittinen muunnos tapahtuu ensimmäisellä rivillä? 
Se tapahtuu ensimmäisellä rivillä, koska ainoa käytettävissä oleva operaattori + on operaattori + (Int &) (jolla on implisiittinen Int-parametri tälle instanssille). Toinen rivi epäonnistuu, koska ensimmäinen parametri on int eikä sillä ole aavistustakaan, että sen on muutettava se ennen operaation yrittämistä (se ei tiedä, että sen on käytettävä Int :: operaattoria +).
Voit välttää tämän ongelman tekemällä operaattorista ei-jäsenystävä-toiminnon (http://ideone.com/YCf7wX)
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
ystävä Int-operaattori + (const Int & lhs, const Int & rhs);
};
Int-operaattori + (const Int & lhs, const Int & rhs)
{
paluu lhs._i + rhs._i;
}
int main ()
{
Int i;
i + 5;
5 + i;
paluu 0;
}
|
Eikö vastausta etsit? Selaa muita kysymyksiä, jotka on merkitty tunnisteella c ++ operaattori-avainsana implisiittinen muunnos tai kysy oma kysymyksesi.